﻿#define _CRT_SECURE_NO_WARNINGS

//原码 反码补码
//原码 将数字转换成二进制
//反码 符号位不变，其他依次按位取反
//补码 反码最后一位加1

//正数的原码 反码 补码 相等
//内存中存储的是补码的二进制序列

//计算是怎么计算的呢
//原码——>反码——>补码
//    取反       加一


//移位操作符
//<<左移操作符：左边抛弃 右边补0
//>>右移操作符：
//				1. 逻辑右移：左边⽤0填充，右边丢弃
//              2. 算术右移：左边⽤原该值的符号位填充，右边丢弃

#include <stdio.h>
//int main()
//{
//	int a = 10;
//	int b = a << 1;
//	//移动的是存储在内存中的二进制位（补码）
//
//	//10
//	//00000000000000000000000000000000000001010
//	//变成20
//	//00000000000000000000000000000000000010100
//	
//	printf("b = %d\n", b);
//	printf("a = %d\n", a);
//	//虽然是再a上面改动但是a的值不变
//
//	return 0;
//}


//int main()
//{
//	int a = -1;
//	//10000000000000000000000000000000000000001：原码
//	//11111111111111111111111111111111111111110：反码
//	//11111111111111111111111111111111111111111：补码
//	//
//	//11111111111111111111111111111111111111110：补码
//	//11111111111111111111111111111111111111101：反码
//	//10000000000000000000000000000000000000010：原码
//	int b = a << 1;
//
//	printf("b = %d\n", b);//-2
//	printf("a = %d\n", a);//-1
//
//	return 0;
//}


//>>右移操作符：
//				1. 逻辑右移：左边⽤0填充，右边丢弃
//              2. 算术右移：左边⽤原该值的符号位填充，右边丢弃

//到底用哪一种方式，取决于编译器，通常采用的是算术右移
//
//int main()
//{
//	int a = -10;
//	//1000000000000000000000000001010
//	//1111111111111111111111111110101
//	//1111111111111111111111111110110:补码
//	// 
//	//1111111111111111111111111111011：补码
//	//1000000000000000000000000000100
//	//1000000000000000000000000000101：原码-5
//	int b = a >> 1;//算术右移
//
//	printf("b = %d\n", b);
//	printf("a = %d\n", a);
//	return 0;
//}

//位操作符:& | ^ ~
//&——>按（二进制）位与
//|——>按（二进制）位或
//int main()
//{
//	int a = 6;
//
//	//00000000000000000000000000000110:补码
//	//
//	int b = -7;
//	//10000000000000000000000000000111
//	//11111111111111111111111111111000
//	//11111111111111111111111111111001：补码
//	int c = a & b;//有0就是0，全是1才是1
//	//00000000000000000000000000000110—6
//	//11111111111111111111111111111001—-7
//	//00000000000000000000000000000000—0
//	printf("c = %d\n", c);
//	return 0;
//}

//
//int main()
//{
//	int a = 6;
//
//	//00000000000000000000000000000110:补码
//	//
//	int b = -7;
//	//10000000000000000000000000000111
//	//11111111111111111111111111111000
//	//11111111111111111111111111111001：补码
//	int c = a | b;//有1就是1，全是0才是0
//	//00000000000000000000000000000110—6
//	//11111111111111111111111111111001—-7
//	//11111111111111111111111111111111：补码
//	//10000000000000000000000000000000
//	//10000000000000000000000000000001：原码
//	printf("c = %d\n", c);
//	return 0;
//}

//
//
//int main()
//{
//	int a = 6;
//
//	//00000000000000000000000000000110:补码
//	//
//	int b = -7;
//	//10000000000000000000000000000111
//	//11111111111111111111111111111000
//	//11111111111111111111111111111001：补码
//	int c = a ^ b;//相同为0，相异为1
//	//00000000000000000000000000000110—6
//	//11111111111111111111111111111001—-7
//	//11111111111111111111111111111111：补码
//	//10000000000000000000000000000000
//	//10000000000000000000000000000001：原码
//	printf("c = %d\n", c);
//	return 0;
//}
//
//
//int main()
//{
//	int a = 0;
//	printf("%d\n", ~a);
//	//~按二进制位取反
//	//00000000000000000000000000000000 0的补码
//	//11111111111111111111111111111111 取反后补码
//	//10000000000000000000000000000000
//	//10000000000000000000000000000001—>-1
//
//	return 0;
//}

//
//int main()
//{
//	int a = 3;
//	int b = 5;
//
//	int c = 0;
//	//交换a和b的值
//	c = a;
//	a = b;
//	b = c;
//
//
//	printf("a = %d\n", a);
//	printf("b = %d\n", b);
//
//	return 0;
//}

//int main()
//{
//	int a = 3;
//	int b = 5;
//	//交换a和b的值
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//
//	printf("a = %d\n", a);
//	printf("b = %d\n", b);
//
//	return 0;
////}



//int count_bit_one(unsigned int num)
//{
//	int count = 0;
//	while (num)
//	{
//		if ((num % 2) == 1 )
//
//			count++;
//		num = num / 2;
//	}
//	return count;
//}
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	int ret = count_bit_one(num);
//	printf("%d的二进制里面 1 的个数为：%d ",num, ret);
//	return 0;
//}
//
//
//
//int count_bit_one(int n)
//{
//	int i = 0;
//	int count = 0;
//	//00000000000000000000000000001111
//	//按位与1
//	for (i = 0; i < 32; i++)
//	{
//		if ((n >> i) & 1 == 1)
//		{
//			count++;
//		}
//		
//	}
//	return count;
//}
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	int ret = count_bit_one(num);
//	printf("%d的二进制里面 1 的个数为：%d ",num, ret);
//	return 0;
//}


//
//int count_bit_one(int n)
//{
//	int i = 0;
//	int count = 0;
//	//00000000000000000000000000001111
//	//按位与1
//	for (i = 0; i < 32; i++)
//	{
//		if ((n >> i) & 1 == 1)
//		{
//			count++;
//		}
//
//	}
//	return count;
//}
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	int ret = count_bit_one(num);
//	printf("%d的二进制里面 1 的个数为：%d ", num, ret);
//	return 0;
//}


//
//// n = n & (n - 1)把n的二进制序列中的最右边的1 去掉了
////n = 1011
////n-1=1010
////n = 1010
////n-1=1001
////n = 1000
////n-1=0111
////n = 0000
//
//int count_bit_one(int n)
//{
//	int i = 0;
//	int count = 0;
//
//	while (n)
//	{
//		n = n & (n - 1);
//		count++;
//	}
//	return count;
//}
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	int ret = count_bit_one(num);
//	printf("%d的二进制里面 1 的个数为：%d ", num, ret);
//	return 0;
//}

//
////判断 n是否是2的次方数？
//void count_bit_one(int n)
//{
//	int i = 0;
//	int count = 0;
//
//	if ((n = n & (n - 1)) == 0)
//	{
//		printf("Yes");
//	}
//	else
//	{
//		printf("No");
//	}
//
//}
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	count_bit_one(num);
//	//int ret = count_bit_one(num);
//	//printf("%d的二进制里面 1 的个数为：%d ", num, ret);
//	return 0;
//}
////16:01000
////n=01000
////n-1=00111

//编写代码将13二进制序列的第五位修改为1，然后再改回0
//                           n
//int main()
//{
//	int a = 13;
//	//0000000000000000000000000000000000001101
//	//0000000000000000000000000000000000010000
//	//0000000000000000000000000000000000000001
//	int n = 5;
//	a = a | (1 << (n - 1));//有1就是1
//	printf("a = %d\n", a);
//	//0000000000000000000000000000000000011101
//	//1111111111111111111111111111111111101111
//
//	//
//	a = a & (~(1 << (n - 1)));//全1才是1
//	printf("a = %d", a);
//	return 0;
//
//}

//在单目操作符中：
//&——取地址操作符
//*——解引用操作
//
// 
// 
// ,表达式，从左到右 依此计算 只需要最后一个结果
//int main()
//{
//	int a = 1;
//	int b = 2;
//	int c = (a > b, a = b + 10, a, b = a + 1); 
//	printf("%d ", c);
//	return 0;
//}

//
//int main()
//{
//	int a = 1, b = 2;
//	int c = 0, d = 2;
//	if (a = b + 1, c = a / 2, d > 0)//只要后面的代码
//	{
//		printf("yes");
//	}
//	return 0;
//}
////伪代码




//[]操作符
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6 };
//	int m = arr[4];
//	//[]下标引用操作符 -操作数是：arr 4
//	//3+5 +是操作符 -操作数是3 5
// printf("%d",m);
//
//	return 0;
//}


////()函数调用操作符
//int Add(int x, int y)
//{
//	return x + y;
//}
//int main()
//{
//	//() 就是函数调用操作符
//	//操作数是：函数名 字符串 100
//	printf("hehe\n");
//	printf("%d", 100);
//	int a = 10;
//	int b = 20;
//	int c = Add(a, b);
//	printf("%d + %d = %d\n", a, b, c);//操作数是： Add 3 5
//	//函数调用操作符最少几个操作数：
//
//	return 0;
//
//}

////学生类型
//struct Student
//{
//	char name[20];//名字
//	int age;//年龄
//	char sex[5];//性别
//	char id[20];//学号
//}s4, s5, s6;//全局变量
//
//struct Student s3;//全局变量
//
//struct Point
//{
//	int x;
//	int y;
//};
//
//struct S
//{
//	char ch;
//	struct Point p;
//	int arr[10];
//	double d;
//
//};
//int main()
//{
//	int a;
//	struct Student s1 = { "王源",23,"男","521" };//局部变量
//	struct Student s2 = { "李响",21,"女","521" };//初始化，一一对应
//	struct Point p = { 10,20 };
//	struct S s = { 'a',{4,5},{1,2,3,4,5,6,7},3.14 };
//
//	printf("%c", s.ch);
//	printf("坐标是:%d,%d\n", s.p.x, s.p.y);
//	for (int i = 0; i < 7; i++)
//	{
//		printf("%d ", s.arr[i]);
//
//	}
//	printf("\n");
//	printf("%d\n", s.arr[0]);
//	printf("%.2lf\n", s.d);
//
//	//结构体变量.结构体名字
//	//->这个是依赖指针
//	return 0;
//
//}
//
//
//int main()
//{
//	int r = 3 + 4 * 5;//先乘除，再加减
//
//
//	return 0;
//}